using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace UIDesigner
{
  public partial class メニュー : Form
  {
    private オプション m_オプション;
    public メニュー()
    {
      InitializeComponent();
      //コンボボックスの初期化
      SetComboBox(this.comboフォーム);
      this.comboフォーム.Text = (string)this.comboフォーム.Items[0];
      //オプションフォームインスタンスの作成（最初は非表示状態）
      m_オプション = new オプション();
      this.AddOwnedForm(m_オプション);
      //出力
      Write(m_selected_form);
    }
    //フォームデザイナでフォームを作成した場合は、　　▼
    //GetFormInstanceとSetComboBoxに追加して下さい。
    public Form GetFormInstance(string formName)
    {
      switch (formName)
      {
        case "実績入力":
          return new 実績入力();
        case "テストフォーム":
          return new テストフォーム();
        case "メニュー":
          return this;
        case "オプション":
          return this.m_オプション;
        default:
          Debug.Assert(false, "コンボボックスの値からフォームを作れません。");
          return null;
      }
    }
    public void SetComboBox(ComboBox cb)
    {
      cb.Items.Add("実績入力");
      cb.Items.Add("テストフォーム");
      cb.Items.Add("メニュー");
      cb.Items.Add("オプション");
    }
    //------------------------------------------------▲

    private Form m_selected_form
    {
      get
      {
        return this.GetFormInstance(this.comboフォーム.Text);
      }
    }

    public void Write(Form form)
    {
      this.textBox.Text = "";
      SortedControls sortedControls = new SortedControls(form);
      if (this.radioCSV.Checked)
      {
        this.textBox.Text = CtrlDataMaker.OutCSV(form.Controls);
      }
      else if (this.radioフォーマット.Checked)
      {
        this.textBox.Text = CtrlDataMaker.OutNormal(form.Controls);
      }
      else if (this.radio詳細フォーマット.Checked)
      {
        this.textBox.Text = CtrlDataMaker.OutDetails(form.Controls);
      }
      else if (this.radioコード.Checked)
      {
        this.textBox.Text = CtrlSrcMaker.OutCode(sortedControls);
      }
      else if (this.radioフォーム情報.Checked)
      {
        this.textBox.Text = FormDataMaker.OutForm(form);
      }
      else if (this.radioCreateWindow.Checked)
      {
        this.textBox.Text = FormSrcMaker.OutCreateWindow(form);
      }
      else if (this.radio全コード.Checked)
      {
        this.textBox.Text = CtrlSrcMaker.OutWinProc(sortedControls) + FormSrcMaker.OutWinMain(form);
      }

      if (this.check自動クリップボードコピー.Checked)
      {
        Clipboard.SetText(this.textBox.Text);
      }
    }

    //テキストボックスで全て選択を実行できるようにする
    //http://ukiya.sakura.ne.jp/index.php?%EF%BC%A3%EF%BC%83%E3%82%B3%E3%83%BC%E3%83%89%E6%96%AD%E7%89%87%2F%E5%85%B1%E9%80%9A%2F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A7%20CTRL%2BA%20%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B
    protected override bool ProcessDialogKey(Keys keyData)
    {
      switch (keyData)
      {
        case Keys.A | Keys.Control:
          if (this.ActiveControl is TextBox)
          {
            TextBox txt = (TextBox)this.ActiveControl;
            txt.SelectAll();
            return true;
          }
          break;
      }
      return base.ProcessDialogKey(keyData);
    }

    //テストボタンを押した時に何かしてもいいですよ。
    private void buttonテスト_Click(object sender, EventArgs e)
    {
    }

    private void フォーム表示_Click(object sender, EventArgs e)
    {
      this.AddOwnedForm(m_selected_form);
      m_selected_form.Show();
    }

    private void 出力_Click(object sender, EventArgs e)
    {
      Write(m_selected_form);
    }

    private void radio_CheckedChanged(object sender, EventArgs e)
    {
      Write(m_selected_form);
    }

    private void comboフォーム_SelectedIndexChanged(object sender, EventArgs e)
    {
      Write(m_selected_form);
      if (m_selected_form == this)
      {
        // フォーム表示_Click メソッドの this.AddOwnedForm(m_selected_form); での循環参照防止
        this.フォーム表示.Enabled = false;
      }
      else
      {
        this.フォーム表示.Enabled = true;
      }
    }

    private void buttonオプション_Click(object sender, EventArgs e)
    {
      m_オプション.Show();
    }

    private void buttonUlitity出力_Click(object sender, EventArgs e)
    {
      this.textBox.Text = CppCode.Utility();
    }
  }
}
